package org.crazyit.cloud.contract;

import feign.Contract;
import feign.MethodMetadata;
import org.springframework.cloud.netflix.feign.support.SpringMvcContract;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * @Author JLL
 * @Date 2019/2/10/0010 下午 1:10
 */
public class MyContract extends SpringMvcContract {

    /**
     * 含义：处理类级别的注解
     */
    @Override
    protected void processAnnotationOnClass(MethodMetadata methodMetadata, Class<?> aClass) {
    }

    /**
     * 含义：处理类方法的注解
     *
     * 这个例子是实现方法级的注解、MyUrl只能用在方法上
     */
    @Override
    protected void processAnnotationOnMethod(MethodMetadata methodMetadata,
                                             Annotation annotation, Method method) {
        //父类的方法还是要保留.
        super.processAnnotationOnMethod(methodMetadata,annotation,method);

        //这个注解是MyUrl才处理，其他的不处理
        if(MyUrl.class.isInstance(annotation)){
            //通过method获得MyUrl这个注解的实例
            MyUrl myUrl = method.getAnnotation(MyUrl.class);
            String url = myUrl.url();
            String httpMethod = myUrl.method();
            //requestTemplate对象主要是保存http请求的信息的。 例如url，端口啊，请求头啊等
            methodMetadata.template().method(httpMethod);
            //为什么是append，因为hello是添加在原来url的后面的。如果要取代原url的话，直接用url()即可
            methodMetadata.template().append(url);
        }

    }

    /**
     * 含义：处理类参数的注解
     */
    @Override
    protected boolean processAnnotationsOnParameter(MethodMetadata methodMetadata, Annotation[] annotations, int i) {
        return false;
    }
}
